package com.atguigu.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @Author lizhenchao@atguigu.cn
 * @Date 2021/11/26 14:03
 */
public class DimUtil {
    public static JSONObject readDimFromPhoenix(Connection conn, String table, Long id) {
        
        String sql = "select * from " + table + " where id=?";
        Object[] args = {id.toString()};
        
        List<JSONObject> list = JdbcUtil.queryList(conn, sql, args, JSONObject.class);
        // 咱们这个具体的sql, 要么查到一条数据,要么查不到
        return list.size() == 1 ? list.get(0) : new JSONObject();
    }
    
    public static JSONObject readDim(Connection conn, Jedis redisClient, String table, Long id) {
        
        JSONObject dim = readDimFromRedis(redisClient, table, id);
        if (dim == null) {
            System.out.println(table + "  " + id + "  走的数据库");
            // 没有从redis获取到维度
            dim = readDimFromPhoenix(conn, table, id);
            // 把dim写入到redis中
            writeDimToRedis(redisClient, table, id, dim);
        }else{
            System.out.println(table + "  " + id + "  走的是缓存");
        }
        
        return dim;
    }
    
    private static void writeDimToRedis(Jedis redisClient, String table, Long id, JSONObject dim) {
        String key = table + ":" + id;
        /*redisClient.set(key, dim.toJSONString());
        redisClient.expire(key, 2 * 24 * 60 * 60);*/
        redisClient.setex(key, 2 * 24 * 60 * 60, dim.toJSONString());
    }
    
    private static JSONObject readDimFromRedis(Jedis redisClient, String table, Long id) {
        String key = table + ":" + id;
        return JSON.parseObject(redisClient.get(key));
    }
    
}
/*
dim在redis中的数据类型的选择?
方便读写

string
    key                     value
    dim_user_info:id        dim的json格式的字符串
    
    
    缺点:
        一个id占用一个key, key多, 不方便管理      解决:  把维度的数据单独存入到一个库中
        
     
    优点:
         1. 每个id的维度数据可以单独设置过期时间
         2. 读写方便

list
    key                     value
    dim_user_info           json格式的数据, 组成的list集合
    
    
    好处: 一个表一个key, key的数据比较少, 方便管理
    
    缺点:
        1. 存比较方便
        2. 读比较麻烦

set


hash

    key               field           value
    dim_user_info      id1               json字符串
                        id2               json字符串

好处: 1. 方便读写
      2. key相对较少, 管理方便
      
缺点:
    没有办法给每个dim分别设置过期时间
    
zset



 */